/**
 * @file 统一的标签页操作接口
 * @description 提供统一的标签页操作接口，合并冗余功能
 * @author 黄敏
 * @version 1.0.0
 * @since 2025-08-22
 */

import { TAB_IDS } from '~shared/constants'

/**
 * 标签页操作管理器
 */
export const TabOperationsManager = {
  /**
   * 获取下一个活动标签页ID
   * @param currentActiveId 当前活动标签页ID
   * @param closingIds 要关闭的标签页ID数组
   * @param allTabs 所有标签页的线性列表
   * @returns 下一个活动标签页ID
   */
  getNextActiveTabId(
    currentActiveId: number,
    closingIds: number[],
    allTabs: F2.tab.PersistData[] | F2.tab.Entity[]
  ) {
    if (!closingIds.includes(currentActiveId)) {
      return currentActiveId
    }

    // 找到当前活动标签页的索引
    const currentActiveIdx = allTabs.findIndex(tab => tab.id === currentActiveId)

    // 优先向右查找不在关闭列表中的标签页
    let nextActiveIdx = -1
    for (let i = currentActiveIdx + 1; i < allTabs.length; i++) {
      const t = allTabs[i]
      if (t && !t.isInSeparateWindow && !closingIds.includes(t.id)) {
        nextActiveIdx = i
        break
      }
    }

    // 如果右侧没有找到，向左查找不在关闭列表中的标签页
    if (nextActiveIdx === -1) {
      for (let i = currentActiveIdx - 1; i >= 0; i--) {
        const t = allTabs[i]
        if (t && !t.isInSeparateWindow && !closingIds.includes(t.id)) {
          nextActiveIdx = i
          break
        }
      }
    }

    // 设置新的活动标签页
    return nextActiveIdx === -1 ? void 0 : allTabs[nextActiveIdx]!.id
  },

  /**
   * 批量过滤标签页或分组
   * @param tabs 标签页或分组数组
   * @param filterIds 要过滤的ID数组
   * @returns 过滤后的数组
   */
  filterTabsOrGroups(tabs: F2.tab.TabOrGroup[], filterIds: number[]): F2.tab.TabOrGroup[] {
    return tabs
      .map(t => {
        if (t.type === 'tab') {
          return filterIds.includes(t.id) ? null : t
        } else if (t.type === 'group') {
          t.tabs = t.tabs.filter(tab => tab.id && !filterIds.includes(tab.id))
          return t.tabs.length > 0 ? t : null // 分组为空则返回null
        }
        return t
      })
      .filter(Boolean) as F2.tab.TabOrGroup[]
  },

  /**
   * 记录最后关闭的标签页索引
   * @param closingIds 要关闭的标签页ID数组
   * @param allTabs 所有标签页的线性列表
   * @returns 最后关闭的标签页索引
   */
  getLastClosedTabIndex(closingIds: number[], allTabs: F2.tab.Entity[]): number | null {
    if (closingIds.length === 0) return null
    const lastClosedId = closingIds.at(-1)
    const index = allTabs.findIndex(t => t.id === lastClosedId)
    return index === -1 ? null : index
  },

  /**
   * 检查是否为特殊标签页ID
   * @param tabId 标签页ID
   * @returns 是否为特殊标签页
   */
  isSpecialTabId(tabId: number): boolean {
    return Object.values(TAB_IDS).includes(tabId as (typeof TAB_IDS)[keyof typeof TAB_IDS])
  }
}
